// #include <iostream>
// #include <memory> // 智能指针头文件
//
// // 演示结构体
// struct Student {
//     int id;
//     std::string name;
// };
//
// // 演示函数指针
// void printStudent(const Student* s) {
//     std::cout << "ID: " << s->id << ", Name: " << s->name << std::endl;
// }
//
// int main() {
//     // ========== 基础指针操作 ==========
//     int num = 42;
//     int* ptr = &num; // 声明并初始化指针
//
//     std::cout << "=== 基础指针 ===" << std::endl;
//     std::cout << "变量值: " << num << std::endl;
//     std::cout << "指针地址: " << ptr << std::endl;
//     std::cout << "指针解引用: " << *ptr << "\n" << std::endl;
//
//     // ========== 指针与数组 ==========
//     int arr[3] = {10, 20, 30};
//     int* arrPtr = arr; // 数组名即首地址
//
//     std::cout << "=== 数组指针 ===" << std::endl;
//     std::cout << "首元素: " << *arrPtr << std::endl;
//     std::cout << "指针算术运算: " << *(arrPtr + 1) << std::endl; // 访问第二个元素
//     std::cout << "数组遍历: ";
//     for(int* p = arr; p != arr + 3; ++p) {
//         std::cout << *p << " ";
//     }
//     std::cout << "\n" << std::endl;
//
//     // ========== 动态内存管理 ==========
//     int* dynPtr = new int(100); // 堆内存分配
//     std::cout << "=== 动态内存 ===" << std::endl;
//     std::cout << "堆内存值: " << *dynPtr << std::endl;
//     delete dynPtr; // 必须释放内存
//     dynPtr = nullptr; // 避免悬空指针
//
//     // ========== 结构体指针 ==========
//     Student stu{2023, "Alice"};
//     Student* stuPtr = &stu;
//     std::cout << "=== 结构体指针 ===" << std::endl;
//     std::cout << "箭头运算符: " << stuPtr->name << std::endl;
//     std::cout << "解引用访问: " << (*stuPtr).id << "\n" << std::endl;
//
//     // ========== 函数指针 ==========
//     void (*funcPtr)(const Student*) = &printStudent;
//     std::cout << "=== 函数指针 ===" << std::endl;
//     funcPtr(&stu);
//     std::cout << std::endl;
//
//     // ========== 智能指针（C++11）==========
//     std::unique_ptr<Student> smartPtr(new Student{2024, "Bob"});
//     std::cout << "=== 智能指针 ===" << std::endl;
//     std::cout << "自动管理内存: " << smartPtr->name << "\n" << std::endl;
//
//     // ========== 指针的指针 ==========
//     int value = 99;
//     int* ptr1 = &value;
//     int** ptr2 = &ptr1;
//     std::cout << "=== 双重指针 ===" << std::endl;
//     std::cout << "二级解引用: " << **ptr2 << "\n" << std::endl;
//
//     // ========== 指针的注意事项 ==========
//     std::cout << "=== 注意事项 ===" << std::endl;
//     // 1. 空指针
//     int* nullPtr = nullptr;
//     // std::cout << *nullPtr; // 运行时错误
//
//     // 2. 野指针示例（不要模仿）
//     // int* wildPtr; // 未初始化
//     // std::cout << *wildPtr; // 不可预测行为
//
//     // 3. 内存泄漏示例（不要模仿）
//     // int* leakPtr = new int[100];
//     // 忘记delete[] leakPtr;
//
//     return 0;
// }